package com.zero.zeroframe.ktx

import java.math.BigDecimal

/**
 * 提供精确的加法运算
 */
fun Double.add(value: Double):Double {
    val b1 = BigDecimal(this)
    val b2 = BigDecimal(value)
    return b1.add(b2).toDouble()
}

/**
 * 提供精确的减法运算
 */
fun Double.sub(value: Double):Double {
    val b1 = BigDecimal(this)
    val b2 = BigDecimal(value)
    return b1.subtract(b2).toDouble()
}

/**
 * 提供精确的乘法运算
 */
fun Double.mul(value: Double):Double {
    val b1 = BigDecimal(this)
    val b2 = BigDecimal(value)
    return b1.multiply(b2).toDouble()
}

/**
 * 提供（相对）精确的除法运算，当发生除不尽的情况时，
 * @param scale 小数点后保留几位，以后的数字四舍五入。
 */
fun Double.div(value: Double, scale: Int = 10):Double {
    require(scale >= 0) { "The scale must be a positive integer or zero" }
    val b1 = BigDecimal(this)
    val b2 = BigDecimal(value)
    return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
}

/**
 * 提供精确的除余
 */
fun Double.remainder(value: Double):Double {
    val b1 = BigDecimal(this)
    val b2 = BigDecimal(value)
    return b1.remainder(b2).toDouble()
}

/**
 * 提供精确的小数位四舍五入处理
 * @param scale 小数点后保留几位
 */
fun Double.round(scale: Int): Double {
    require(scale >= 0) { "The scale must be a positive integer or zero" }
    val b = BigDecimal(this)
    val one = BigDecimal("1")
    return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).toDouble()
}

/**
 * 提供精确的小数位四舍五入处理
 * @param scale 小数点后保留几位
 */
fun Double.roundText(scale: Int): String {
    require(scale >= 0) { "The scale must be a positive integer or zero" }
    val b = BigDecimal(this)
    val one = BigDecimal("1")
    return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).toString()
}

